package ru.emms.codemeter;

import com.intellij.openapi.actionSystem.ActionPlaces;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.actionSystem.DataKeys;
import com.intellij.openapi.actionSystem.Presentation;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
import ru.emms.codemeter.forms.ResultViewForm;
import ru.emms.codemeter.metrics.MetricsManager;

import javax.swing.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;


/**
 * Created by IntelliJ IDEA.
 * User: dima.sam
 * Date: 28.07.2010
 * Time: 12:26:01
 * запуск плагина различными способами (из главного меню, из контекстного меню, кнопочкой на toolbar'е)
 */
public class StartPluginActions
    extends AnAction {

    private List<Module> modules;
    private Logger log = Logger.getInstance(getClass().getName());
    private Project project;

    /**
     * описывает реакцию на выбор в меню Tools пункта Calculate Metric
     *
     * @param actionToolsMenu событие при выборе в меню Tools пункта Calculate Metric
     */
    public void actionPerformed(AnActionEvent actionToolsMenu) {
        boolean callFromPopup = actionToolsMenu.getPlace().equals(ActionPlaces.PROJECT_VIEW_POPUP);
        log.info("открытие плагина codemeter");
        DataContext dataContext = actionToolsMenu.getDataContext();
        project = DataKeys.PROJECT.getData(dataContext);
        if (project != null) {
            log.debug("текущий проект:  " + project.getName());
            startResultViewForm(modules, callFromPopup);
        } else {
            Messages.showMessageDialog("Не выбрано ни одного проекта", "ошибка", null);
            log.debug("проект не выбран");
        }
    }

    @Override
    public void update(AnActionEvent actionEvent) {
        super.update(actionEvent);
        boolean callFromPopup = actionEvent.getPlace().equals(ActionPlaces.PROJECT_VIEW_POPUP);
        if (callFromPopup) {
            DataContext dataContext = actionEvent.getDataContext();
            Presentation presentation = actionEvent.getPresentation();
            List<Module> modules = new ArrayList<Module>();
            Module[] modulesArray = DataKeys.MODULE_CONTEXT_ARRAY.getData(dataContext);
            if (modulesArray == null) {
                presentation.setEnabled(false);
                presentation.setVisible(false);
                return;
            }
            modules.addAll(Arrays.asList(modulesArray));
            this.modules = modules;
            presentation.setEnabled(true);
            presentation.setVisible(true);
        }
    }

    /**
     * Запускает Form плагина
     *
     * @param modules       выбранные модули
     * @param callFromPopup истина, если вызов произошел из контекстного меню проекта
     */
    private void startResultViewForm(List<Module> modules, boolean callFromPopup) {
        MetricsManager metricsManager = new MetricsManager(project);
        createResultViewForm(metricsManager, modules, callFromPopup);
    }

    /**
     * Создает визуальную форму плагина
     *
     * @param metricsManager передается класс для вычисления метрик(функционал формы)
     * @param modules        выбранные модули
     * @param callFromPopup  истина, если вызов произошел из контекстного меню проекта
     */
    private void createResultViewForm(MetricsManager metricsManager, List<Module> modules, boolean callFromPopup) {
        JFrame mainForm = new JFrame("Вычисление метрик");
        mainForm.setSize(500, 500);
        mainForm.setVisible(true);
        mainForm.setResizable(false);
        ResultViewForm resultViewForm = new ResultViewForm(metricsManager, modules, callFromPopup);
        mainForm.getContentPane().add(resultViewForm.getRootPanel());
        mainForm.setVisible(true);
        mainForm.pack();
    }


}
